#include "StatusCode.h"

using namespace std;

/** Constructeur par défaut.
 * Permet de construire un StatusCode avec ses différents champs.
 *
 * @param etat \e true ou \e false, suivant la réussite ou l'échec
 * d'une méthode (par défaut \e true).
 * @param val valeur de renvoi de la fonction (par défaut, 0).
 * @param code valeur du code d'erreur (par défaut, 0).
 * @param message valeur du messge que l'on veut propager (par défaut
 * "").
 */
StatusCode::StatusCode(const bool& etat, const int& val, const int& code,
	     const string& message)
  : Etat( etat ), Valeur( val ), Code( code ), Message( message )
{}

/** Constructeur de copie
 * Permet de réaliser une copie proprement d'un StatusCode.
 *
 * @param sc StatusCode à copier.
 */
StatusCode::StatusCode(const StatusCode& sc)
  : Etat( sc.Etat ), Valeur( sc.Valeur ), Code( sc.Code ),
    Message( sc.Message )
{}

/**
 * Destructeur, ne fait rien de spécial.
 */
StatusCode::~StatusCode()
{}

/**
 * Permet de convertir un StatusCode en bool, afin de pouvoir écrire
 * simplement :
 * @code
 * StatusCode sc( maFonction );
 *
 * if ( sc )
 * { ... }
 * @endcode
 *
 * L'opérateur renvoie simplement la valeur du champ Etat.
 */
StatusCode::operator bool() const
{
  return Etat;
}

/**
 * Permet de convertir un StatusCode en int. L'opérateur renvoie alors
 * la valeur du champ Valeur.
 */
StatusCode::operator int() const
{
  return Valeur;
}

/**
 * Permet d'accéder au champ Etat.
 *
 * @return Etat.
 */
const bool& StatusCode::etat() const
{
  return Etat;
}

/**
 * Permet d'accéder au champ Valeur.
 *
 * @return Valeur.
 */
const int& StatusCode::valeur() const
{
  return Valeur;
}

/**
 * Permet d'accéder au champ Code.
 *
 * @return Code.
 */
const int& StatusCode::code() const
{
  return Code;
}

/**
 * Permet d'accéder au champ Message.
 *
 * @return Message.
 */
const string& StatusCode::message() const
{
  return Message;
}

ostream& operator<<(ostream& os, const StatusCode& sc)
{
  os << "Valeur : " << sc.valeur() << ", Code : " << sc.code() << ", "
     << sc.message();
  return os;
}
